package com.situ.skymall.user.api.controller;

import com.situ.model.CnRegionInfo;
import com.situ.service.CnRegionInfoService;
import com.situ.utils.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 地区信息 Controller
 */
@RestController
@RequestMapping("/api/v1/region")
public class CnRegionInfoController {

    private final CnRegionInfoService cnRegionInfoService;

    @Autowired
    public CnRegionInfoController(CnRegionInfoService cnRegionInfoService) {
        this.cnRegionInfoService = cnRegionInfoService;
    }

    /**
     * 错获取所有省份数据
     */
    @GetMapping("/provinces")
    public JsonResult<?> getProvinces() {
        try {
            List<CnRegionInfo> provinces = cnRegionInfoService.getAllProvinces();
            if (provinces == null || provinces.isEmpty()) {
                return JsonResult.fail(404, "未找到省份数据");
            }
            return JsonResult.success(provinces);
        } catch (Exception e) {
            return JsonResult.fail("获取省份数据失败: " + e.getMessage());
        }
    }

    /**
     * 获取指定省份下的城市数据
     */
    @GetMapping("/cities/{provinceCode}")
    public JsonResult<?> getCities(@PathVariable String provinceCode) {
        try {
            // 验证省份代码格式
            if (provinceCode == null || provinceCode.trim().isEmpty()) {
                return JsonResult.fail(400, "省份代码不能为空");
            }
            List<CnRegionInfo> cities = cnRegionInfoService.getCitiesByProvince(provinceCode);
            if (cities == null || cities.isEmpty()) {
                return JsonResult.fail(404, "未找到该省份下的城市数据");
            }
            return JsonResult.success(cities);
        } catch (Exception e) {
            return JsonResult.fail("获取城市数据失败: " + e.getMessage());
        }
    }

    /**
     * 获取指定城市下的区县数据
     */
    @GetMapping("/districts/{cityCode}")
    public JsonResult<?> getDistricts(@PathVariable String cityCode) {
        try {
            // 验证城市代码格式
            if (cityCode == null || cityCode.trim().isEmpty()) {
                return JsonResult.fail(400, "城市代码不能为空");
            }

            List<CnRegionInfo> districts = cnRegionInfoService.getDistrictsByCity(cityCode);
            if (districts == null || districts.isEmpty()) {
                return JsonResult.fail(404, "未找到该城市下的区县数据");
            }
            return JsonResult.success(districts);
        } catch (Exception e) {
            return JsonResult.fail("获取区县数据失败: " + e.getMessage());
        }
    }

    /**
     * 输入id只返回直接子节点
     */
    @GetMapping("/tree/{parentId}")
    public JsonResult<?> getRegionTree(@PathVariable Integer parentId) {
        try {
            // 验证parentId
            if (parentId != null && parentId < 0) {
                return JsonResult.fail(400, "父级ID不能为负数");
            }

            List<CnRegionInfo> regionTree = cnRegionInfoService.getRegionTree(parentId);

            // 空列表是正常情况，不应该返回404错误
            return JsonResult.success(regionTree);
        } catch (Exception e) {
            return JsonResult.fail("获取地区树数据失败: " + e.getMessage());
        }
    }

    /**
     * 获取完整地址树
     */
    @GetMapping("/full-tree/{code}")
    public JsonResult<?> getFullAddressTree(@PathVariable String code) {
        try {
            if (code == null || code.trim().isEmpty()) {
                return JsonResult.fail(400, "地区代码不能为空");
            }
            if (!code.matches("\\d{6,9}")) {
                return JsonResult.fail(400, "地区代码格式不正确");
            }

            CnRegionInfo fullTree = cnRegionInfoService.getFullAddressTreeByCode(code);
            if (fullTree == null) {
                return JsonResult.fail(404, "未找到该地区代码对应的信息");
            }
            return JsonResult.success(fullTree);
        } catch (Exception e) {
            return JsonResult.fail("获取完整地址树失败: " + e.getMessage());
        }
    }

    /**
     * 根据地区代码获取完整地址信息
     */
    @GetMapping("/full-address/{code}")
    public JsonResult<?> getFullAddress(@PathVariable String code) {
        try {
            // 验证地区代码格式
            if (code == null || code.trim().isEmpty()) {
                return JsonResult.fail(400, "地区代码不能为空");
            }
            if (!code.matches("\\d{6}")) {
                return JsonResult.fail(400, "地区代码格式不正确");
            }

            String fullInfo = cnRegionInfoService.getFullInfoByCode(code);
            if (fullInfo == null) {
                return JsonResult.fail(404, "未找到该地区代码对应的信息");
            }
            return JsonResult.success(fullInfo);
        } catch (Exception e) {
            return JsonResult.fail("获取完整地址信息失败: " + e.getMessage());
        }
    }

    /**
     * 根据名称搜索地区
     */
    @GetMapping("/search")
    public JsonResult<?> searchRegion(@RequestParam String name) {
        try {
            if (name == null || name.trim().isEmpty()) {
                return JsonResult.fail(400, "搜索名称不能为空");
            }
            if (name.length() < 2) {
                return JsonResult.fail(400, "搜索名称至少需要2个字符");
            }

            List<CnRegionInfo> results = cnRegionInfoService.searchByName(name);
            if (results == null || results.isEmpty()) {
                return JsonResult.fail(404, "未找到匹配的地区数据");
            }
            return JsonResult.success(results);
        } catch (Exception e) {
            return JsonResult.fail("搜索地区数据失败: " + e.getMessage());
        }
    }
}